package com.hexinfo.dmpro.component.common.service;

import com.hexinfo.dmpro.component.common.entity.TableFieldsEntity;

import java.sql.Connection;
import java.sql.ResultSet;
import java.util.List;
import java.util.Map;

public interface IDatabaseQueryService {

    /*
     * @Method: isTableExist <br>
     * @Param: [conn, dbName, tableName] <br>
     * @Return: boolean <br>
     * @Description：判断指定表是否存在<br>
     * @Author： wz.li<br>
     * @Date： 2023/9/25 17:20 <br>
     * @Version： V2.0.2<br>
     */
    void isTableExist(Connection conn, String dbName, String tableName);

    /*
     * @Method: queryTotalCount <br>
     * @Param: [conn, dbTableName, queryCriteria, queryFlag] <br>
     * @Return: long <br>
     * @Description：指定表数据总量查询<br>
     * @Author： wz.li<br>
     * @Date： 2023/9/25 16:08 <br>
     * @Version： V2.0.2<br>
     */
    long queryTotalCount(Connection conn, String dbTableName, String queryCriteria, String queryFlag);

    /*
     * @Method: queryTableMetadata <br>
     * @Param: [conn, dbTableName, queryFlag] <br>
     * @Return: java.util.List<com.hexinfo.dmpro.component.common.entity.TableFieldsEntity> <br>
     * @Description：指定表元数据查询<br>
     * @Author： wz.li<br>
     * @Date： 2023/9/25 16:20 <br>
     * @Version： V2.0.2<br>
     */
    List<TableFieldsEntity> queryTableMetadata(Connection conn, String dbTableName, String queryFlag);

    /*
     * @Method: queryTableDetailedData <br>
     * @Param: [conn, dbTableName, queryCriteria, queryFlag] <br>
     * @Return: java.sql.ResultSet <br>
     * @Description：指定表明细数据查询<br>
     * @Author： wz.li<br>
     * @Date： 2023/9/25 16:08 <br>
     * @Version： V2.0.2<br>
     */
    ResultSet queryTableDetailedData(Connection conn, String dbTableName, String queryCriteria, String queryFlag);

    /*
     * @Method: queryTableStatisticsData <br>
     * @Param: [conn, dbTableName, queryCriteria, queryFlag] <br>
     * @Return: java.util.Map <br>
     * @Description：查询指定库表的统计数据<br>
     * @Author： wz.li<br>
     * @Date： 2023/9/26 14:53 <br>
     * @Version： V2.0.2<br>
     */
    Map<String, String> queryTableStatisticsData(Connection conn, String dbTableName, String queryCriteria, String queryFlag);

    /*
     * @Method: queryTableData <br>
     * @Param: [conn, querySql] <br>
     * @Return: java.util.List <br>
     * @Description：查询指定sql<br>
     * @Author： wz.li<br>
     * @Date： 2023/9/27 11:17 <br>
     * @Version： V2.0.2<br>
     */
    List queryTableData(Connection conn, String querySql);

    /*
     * @Method: getDbList <br>
     * @Param: [conn] <br>
     * @Return: java.util.List<java.lang.String> <br>
     * @Description：获取指定库集合<br>
     * @Author： wz.li<br>
     * @Date： 2023/10/11 16:33 <br>
     * @Version： V2.0.2<br>
     */
    List<String> getDbList(Connection conn);

    /*
     * @Method: getTableList <br>
     * @Param: [conn, dbName] <br>
     * @Return: java.util.List<java.lang.String> <br>
     * @Description：获取指定库的表集合<br>
     * @Author： wz.li<br>
     * @Date： 2023/10/11 16:34 <br>
     * @Version： V2.0.2<br>
     */
    List<String> getTableList(Connection conn,String dbName);

    /*
     * @Method: queryTablePartition <br>
     * @Param: [conn, dbName, tableName] <br>
     * @Return: java.util.List<java.lang.String> <br>
     * @Description：查询指定库表的分区字段集合<br>
     * @Author： wz.li<br>
     * @Date： 2023/10/11 17:00 <br>
     * @Version： V2.0.2<br>
     */
    List<String> queryTablePartitionList(Connection conn,String dbName, String tableName);

    /*
     * @Method: truncateTable <br>
     * @Param: [conn, dbName, tableName] <br>
     * @Return: void <br>
     * @Description：删除指定表数据<br>
     * @Author： wz.li<br>
     * @Date： 2023/10/12 18:10 <br>
     * @Version： V2.0.2<br>
     */
    void truncateTable(Connection conn, String dbName, String tableName);

    /*
     * @Method: dropTable <br>
     * @Param: [conn, dbName, tableName] <br>
     * @Return: void <br>
     * @Description：删除指定表结构和数据<br>
     * @Author： wz.li<br>
     * @Date： 2023/10/12 18:10 <br>
     * @Version： V2.0.2<br>
     */
    void dropTable(Connection conn, String dbName, String tableName);

    /*
     * @Method: getCreateTableSql <br>
     * @Param: [conn, dbName, tableName] <br>
     * @Return: java.lang.String <br>
     * @Description：获取建表语句<br>
     * @Author： wz.li<br>
     * @Date： 2023/11/7 19:00 <br>
     * @Version： V2.0.2<br>
     */
    String getCreateTableSql(Connection conn, String dbName, String tableName);

    /*
     * @Method: delTablePartition <br>
     * @Param: [conn, dbName, tableName, partitionName, partitionVal] <br>
     * @Return: void <br>
     * @Description：删除指定表指定分区数据<br>
     * @Author： wz.li<br>
     * @Date： 2023/10/12 18:10 <br>
     * @Version： V2.0.2<br>
     */
    void delTablePartition(Connection conn, String dbName, String tableName, String partitionName, String partitionVal);

    /**
     * 执行指定的SQL
     * @param conn
     * @param querySql
     * @return
     */
    ResultSet executeQuery(Connection conn, String querySql);
}
